package com.stone;
/**
 * 使用2DAPi步骤如下：
 * 1、扩展实现android.view.View类
 * 2、实现View的OnDraw方法，使用Canvas方法进行绘制。
 * 使用2D的图形API的场合，自定义实现的View类型作为下层的绘制和上层
 * 的GUI系统的中间层
 * android.graphics.drawable是Android中绘制相关的包，表示一些
 * 可以被绘制的东西。在Android中Drawable的含义可以是仅仅为了显示使用的
 * 与View区别是Drawable不能从用户出获得事件反馈。
 * 事实上使用Android的2D程序结构和实现一个自定义的控件类似
 * 但是他们的策略不不同，使用2dApi是为了实现自由绘制，自定义控件
 * 的目的是在应用程序中使用这些控件，包括可以在布局文件中使用甚至使用
 * 其属性。
 * */
import java.io.InputStream;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.graphics.PorterDuff;
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Demo(this));
    }
    private class  Demo extends View{
        private Bitmap bitmap1;
        private Bitmap bitmap2;
        private Bitmap bitmap3;
        //着色器
        private Shader shader;
		public Demo(Context context) {
			super(context);
	        InputStream is=getResources().openRawResource(R.drawable.icon);
            bitmap1=BitmapFactory.decodeStream(is);
            //提取位图的透明通道
            bitmap2=bitmap1.extractAlpha();
            /**
             * 对RGB颜色格式使用Bitmap.Config定义，
             * 仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565
             * */
            bitmap3=Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8) ;   
		    drawIntoBitmap(bitmap3);
		    //Gradient['ɡreɪdiənt]斜线
			/**	Create a shader that draws a linear gradient along a line.
	        @param x0           The x-coordinate for the start of the gradient line
	        @param y0           The y-coordinate for the start of the gradient line
	        @param x1           The x-coordinate for the end of the gradient line
	        @param y1           The y-coordinate for the end of the gradient line
	        @param  colors      The colors to be distributed along the gradient line
	        @param  positions   May be null. The relative positions [0..1] of
	                            each corresponding color in the colors array. If this is null,
	                            the the colors are distributed evenly along the gradient line.
	        @param  tile        The Shader tiling mode
		*/
		    //
		    /**
		     * Shader.TileMode.MIRROR
		     * 重复着色的图像水平和垂直，交替 
             *镜像图像，使图像始终煤层相邻
		     * */
		    /**
		     * Shader.TileMode.REPEAT
		     * 重复着色的图像水平和垂直
		     * */
		    /**
		     * Shader.TileMode.CLAMP
		     * 如果复制的边缘颜色着色提请以外的
             * 原来的界限
		     * */
		    shader=new LinearGradient(0, 0,100, 70, new int[]{Color.RED, Color.GREEN, Color.BLUE},null,Shader.TileMode.MIRROR);
		}
	
	    @Override
	    protected void onDraw(Canvas canvas) {
	    	// TODO Auto-generated method stub
	    	super.onDraw(canvas);
	       //整个画布为白色
	    	canvas.drawColor(Color.WHITE);
	    	Paint paint=new Paint();
	    	//画笔为红色
	    	paint.setColor(Color.RED);
	    	canvas.drawBitmap(bitmap1, 0, 0, paint);
	    	canvas.drawBitmap(bitmap2, bitmap1.getWidth()+10,bitmap1.getHeight()+10, paint);
	        paint.setShader(shader);
	    	canvas.drawBitmap(bitmap3, bitmap1.getWidth()*2, bitmap1.getHeight()*2, paint);    
	    
	    }
	    //在位图上进行绘制
	    private void drawIntoBitmap(Bitmap bm){
	    	float x=bm.getWidth();
	    	float y=bm.getHeight();
	    	Canvas cv=new Canvas(bm);
	    
	    	Paint p=new Paint();
	    	
	    	//去掉毛边
	    	p.setAntiAlias(true);
	    	/**
	    	 * Alpha通道是一个8位的灰度通道，
	    	 * 该通道用256级灰度来记录图像中的透明度信息，
	    	 * 定义透明、不透明和半透明区域，其中黑表
　　         * 示全透明，白表示不透明，灰表示半透明。
	    	 * 阿尔法通道(Alpha Channel)是指一张图片的透明和
	    	 * 半透明度。
	    	 * 例如：一个使用16位存储的图片，可能5位表示红色，
	    	 * 5位表示绿色，5位表示蓝色，，一位是阿尔法。
	    	 * 在这种情况下，它要么表示透明要么不是。
	    	 * 一个使用32位存储的图片，每8位表示红绿蓝，和阿尔法通道。
	    	 * 在这种情况下，就不光可以表示透明还是不透明，
	    	 * 阿尔法通道还可以表示256级的半透明度。
	    	 * */
	    	//半透明
	    	p.setAlpha(0x80);
	    	cv.drawCircle(x/2, y/2, x/2, p);
	    	p.setAlpha(0x30);
	    	/**
	    	 *   计算机的颜色的表示，
	    	 *   简单来说是RGB，再加上个Alpha透明度
	    	 *   计算机颜色以 RGBchannel三原色来编码（255，255，255）为白色，
	    	 *   每种颜色channel的范围是0-255
	    	 *   但对于porter-duff除了三原色channel、
	    	 *   定义了另一channel，
	    	 *   Alpha channel，Alpha表示透明度，范围也为0-255。
	    	 * 
	    	 * **/
	    	//porter 波特
	    	//duff  达夫 详见jdk中的AlphaComposite类有详尽的描述
	    	p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
	        p.setTextSize(60);
	        p.setTextAlign(Paint.Align.CENTER);
	        Paint.FontMetrics fm=p.getFontMetrics();
	        cv.drawText("Hello", x/2, (y-fm.ascent)/2, p);
	    }
    	
    }
}